package qdu.rgzb.ch1_intent;

import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

/**
 * Intent是安卓内部的一种通讯机制，负责activity、service、receiver三种安卓组件的通讯。
 *
 * 另外一种安卓组件provider本身有通讯实现，不使用intent。
 *
 * Intent中包含6种讯息。详细介绍在课件程序种有介绍
 */
public class Myintent extends Activity{
	Button btn_im;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.myintent);
		
		btn_im = (Button) findViewById(R.id.btn_implicit);
		btn_im.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {
				//***************在同一个app中实现隐式匹配******************
				Intent it = new Intent("myaction", Uri.parse("myqdu://datatech.rjgc"));
				startActivity(it);
				//***************只有action，隐式匹配**************
				//Intent it = new Intent("myaciton3");
				//it.setAction("myaction3");
				//startActivity(it);
				/**
				 * 隐式匹配：在intent对象中没有给出明确的目标组件完整类名，则需要进行隐式匹配。
				 * 隐式匹配需要在intent对象中设置action，category，data三样内容
				 * intent对象设置完成后，需要在系统中所有注册过的组件中进行匹配（过滤 intent-filter）
				 * 组件在注册时可以通过<intent-filter>子标签来指定action、category和data的信息。
				 * 经过intent对象和注册信息中的数据对比，系统可以决定跳转的目标组件。
				 * 有时，经过匹配有多个匹配结果，则弹出窗口让用户进行选择
				 *
				 * 1）intent对象中至少需要指定一个action，可以不指定data和category，但是category是默认存在的，默认为default类型；
				 *    在组件注册时至少需要指定一个action和category，可以不指定data
				 * 2）intent对象中，action可以设置多次，但是只有最后一次的设置起作用，之前的都被覆盖掉。
				 * intent对象中，可以通过构造函数或setAction的成员函数来设置
				 * 3) 在组件注册时，可以声明多个action，不会互相覆盖，但是只有一个可以被匹配到
				 *
				 * 4) data以URI格式来体现(定位)， URI统一资源定位。
				 *    格式:     【协议://路径x.路径y:端口/子路径?key=value】
				 *    在intent对象中通过Uri.parse函数解析uri字符串
				 *    在组件的注册中通过data标签来进行匹配，scheme属性->协议； host属性->路径；path
				 *
				 * 5) 如果action匹配成功，但是intent对象中含有data，则组件注册时也必须有data的子标签，否则不能匹配
				 * 6) intent对象中只能设置一个data；组件注册中可以设置多个data标签；
				 */

			}
		});
		
		findViewById(R.id.btn_explicit).setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {
				/**
				 * 显式匹配:在intent对象中，明确给出目标组件(activity)的完整类名，即设置了有效的componentname；
				 * 目标组件可以在同一个app中，也可以在其它的app中;
				 * 若访问其他app的组件，需要该组件在注册时的exported属性为true
				 * exported 属性默认为false，表明当前组件（activity）不可以被其他app访问
				 */
				//***************在同一个app中显式跳转*****************************
	            //startActivity( new Intent(Myintent.this, Act_explicit.class) );
	            //***************在不同app中显式跳转******************************
				Intent it = new Intent();
				it.setComponent(new ComponentName("qdu.rg012.test1", "qdu.rg012.test1.Act2"));
				//it.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
				//it.setClassName("qdu.rg012.test1", "qdu.rg012.test1.Act1");
				//该函数可以指定目标组件的完成类名（包名 以及  类名）
				startActivity(it);
			}
		});
	}

}
